前天闲逛 Leetcode 看到的一个排序 Linked List 的问题,然后自己尝试实现了一个不符合时间复杂度要求的。问题如下:
Sort a linked list in O(n log n) time using constant space complexity.
我是用递归实现的,没有通过 OJ ,代码附在最后。
然后我就想到了 Java 自身能够排序 Linkedlist 啊,调用 Collections.sort()
就行了啊,于是就找了源码看看,这才是这次要记录的重点。
看 Java 是怎么实现的 Linkedlist ,怎么对他排序的。
实验代码
首先贴上的是实验性质的代码,然后就能顺藤摸瓜,找到关键的排序代码。
|
|
Java 自带的 LinkedList 实现
Java 实现了 LinkedList,看代码就能看到,是在 Util 包下的。那么它的内部实现是什么样子的呢?上代码:
|
|
看起来很简单,就记录了一个 header 和 size ,那么存放在 LinkedList 的数据呢,自然就可以通过 header 然后不断的 next 得到。
header 是一个 Entry 类型的属性,那么它才是能够代表 Linked list 存放数据的方法的主角。
|
|
从这个 Entry 类的实现可以看出默认实现的LinkedList 是一个双向循环链表哦。具体的其他细节略过不表。
LinkedList<Integer> linkeds = new LinkedList<Integer>();
就是一个初始化的过程
执行的是无参的构造方法。
然后是 add()
:
|
|
然后就是依次向这个双向的循环链表中插入5,7,1,4,2这些元素啦。
Linked list 的排序
排序才是重点,下面上代码:
|
|
过程不复杂,下面是具体每步的过程
|
|
注释很详细,很明白,整个过程就是一个归并排序,在规模较小的情况下直接用的插入排序。
总结
Java 实现的 Linked list 还有很多东西这里没有提到,需要的时候再看。
这里实现的排序算法很不错。
PS.
其实这个题目一开始我也想到了归并排序能满足要求,但是最后答好题目不是我的主要目的,主要是快速实现这个目的,于是写了一个简单的,容易想到的递归版本,类似冒泡,哈哈。
|
|
Over.